/**
 * @description ...
 * @author cx
 * @date 2024.08.12 16:28
 */


package com.cx.living.lock;

public class First extends Thread{

    /*这段代码中使用了 显式锁 lock 来保护对共享资源 tickets 的访问，确保多个线程在并发访问 tickets 时不会发生数据竞争。
    synchronized (lock) 确保了互斥性，
    即同一时刻只有一个线程可以执行 synchronized 块中的代码，从而避免了并发导致的错误操作。在并发场景中，这种锁机制保证了
    线程安全，并且避免了因为多个线程同时操作 tickets 而产生的错误结果。*/



//    创建线程的几种方式
    // 1. 继承 Thread 类通过继承 Thread 类并重写其 run() 方法来创建线程。
    //new 实例对象，然后start
    private static int tickets = 200; // 假设有10张票
    private static final Object lock = new Object(); // 锁对象
    @Override
    public void run() {
        while (true) {
            synchronized (lock) {
                if (tickets > 0) {
                    try {
                        // 模拟卖票的时间
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " sold ticket " + tickets--);
                } else {
                    break;
                }
            }
        }
    }

    public static void main(String[] args) {
        First ticketSeller = new First();
        Thread seller1 = new Thread(ticketSeller, "Seller1");
        Thread seller2 = new Thread(ticketSeller, "Seller2");
        Thread seller3 = new Thread(ticketSeller, "Seller3");

        seller1.start();
        seller2.start();
        seller3.start();
    }
}
